package com.charm.restaurant.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.charm.restaurant.common.Result;
import com.charm.restaurant.dto.LoginDTO;
import com.charm.restaurant.entity.Merchant;
import com.charm.restaurant.entity.User;
import com.charm.restaurant.mapper.MerchantMapper;
import com.charm.restaurant.mapper.UserMapper;
import com.charm.restaurant.service.MerchantService;
import com.charm.restaurant.vo.MerchantVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;

import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

/**
 * 商家服务实现类
 */
@Slf4j
@Service
public class MerchantServiceImpl extends ServiceImpl<MerchantMapper, Merchant> implements MerchantService {

    @Autowired
    private UserMapper userMapper;

    /**
     * 商家登录
     */
    @Override
    public Result<MerchantVO> login(LoginDTO loginDTO) {
        // 1. 根据用户名查询商家
        LambdaQueryWrapper<Merchant> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(Merchant::getUsername, loginDTO.getUsername());
        Merchant merchant = this.getOne(queryWrapper);

        // 2. 判断商家是否存在
        if (merchant == null) {
            return Result.error("用户名不存在");
        }

        // 3. 密码比对
        String password = DigestUtils.md5DigestAsHex(loginDTO.getPassword().getBytes(StandardCharsets.UTF_8));
        if (!merchant.getPassword().equals(password)) {
            return Result.error("密码错误");
        }

        // 4. 判断商家状态
        if (merchant.getStatus() == 0) {
            return Result.error("账号已禁用");
        }

        // 5. 生成token
        String token = UUID.randomUUID().toString();

        // 6. 返回商家信息
        MerchantVO merchantVO = new MerchantVO();
        BeanUtils.copyProperties(merchant, merchantVO);
        merchantVO.setToken(token);

        return Result.success(merchantVO);
    }

    /**
     * 商家注册
     */
    @Override
    public Result<MerchantVO> register(Merchant merchant) {
        // 1. 判断用户名是否已存在
        LambdaQueryWrapper<Merchant> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(Merchant::getUsername, merchant.getUsername());
        Merchant existMerchant = this.getOne(queryWrapper);
        if (existMerchant != null) {
            return Result.error("用户名已存在");
        }

        // 2. 密码加密
        String password = DigestUtils.md5DigestAsHex(merchant.getPassword().getBytes(StandardCharsets.UTF_8));
        merchant.setPassword(password);

        // 3. 设置默认值
        merchant.setStatus(1);
        merchant.setDeleted(0);

        // 4. 保存商家
        this.save(merchant);

        // 5. 生成token
        String token = UUID.randomUUID().toString();

        // 6. 返回商家信息
        MerchantVO merchantVO = new MerchantVO();
        BeanUtils.copyProperties(merchant, merchantVO);
        merchantVO.setToken(token);

        return Result.success(merchantVO);
    }

    /**
     * 获取商家信息
     */
    @Override
    public Result<MerchantVO> getMerchantInfo() {
        // 模拟获取当前登录商家ID
        Long merchantId = 1L;

        // 查询商家信息
        Merchant merchant = this.getById(merchantId);
        if (merchant == null) {
            return Result.error("商家不存在");
        }

        // 返回商家信息
        MerchantVO merchantVO = new MerchantVO();
        BeanUtils.copyProperties(merchant, merchantVO);

        return Result.success(merchantVO);
    }

    /**
     * 修改商家信息
     */
    @Override
    public Result<MerchantVO> updateInfo(Merchant merchant) {
        // 模拟获取当前登录商家ID
        Long merchantId = 1L;
        merchant.setId(merchantId);

        // 不允许修改密码
        merchant.setPassword(null);

        // 更新商家信息
        this.updateById(merchant);

        // 查询最新商家信息
        Merchant updatedMerchant = this.getById(merchantId);

        // 返回商家信息
        MerchantVO merchantVO = new MerchantVO();
        BeanUtils.copyProperties(updatedMerchant, merchantVO);

        return Result.success(merchantVO);
    }

    /**
     * 修改密码
     */
    @Override
    public Result<String> updatePassword(String oldPassword, String newPassword) {
        // 从localStorage获取当前登录商家信息
        // 实际项目中应该从JWT或Session中获取商家ID
        Long merchantId = 1L;

        log.info("修改密码，商家ID：{}", merchantId);

        // 查询商家信息
        Merchant merchant = this.getById(merchantId);
        if (merchant == null) {
            return Result.error("商家不存在");
        }

        // 校验旧密码
        String oldPasswordMd5 = DigestUtils.md5DigestAsHex(oldPassword.getBytes(StandardCharsets.UTF_8));
        if (!merchant.getPassword().equals(oldPasswordMd5)) {
            log.warn("旧密码错误，商家ID：{}", merchantId);
            return Result.error("旧密码错误");
        }

        // 更新密码
        String newPasswordMd5 = DigestUtils.md5DigestAsHex(newPassword.getBytes(StandardCharsets.UTF_8));
        merchant.setPassword(newPasswordMd5);
        boolean updated = this.updateById(merchant);

        if (!updated) {
            log.error("密码更新失败，商家ID：{}", merchantId);
            return Result.error("密码修改失败");
        }

        log.info("密码修改成功，商家ID：{}", merchantId);
        return Result.success("密码修改成功");
    }

    /**
     * 获取商家统计数据
     */
    @Override
    public Result<Map<String, Object>> getStatistics() {
        // 模拟获取当前登录商家ID
        Long merchantId = 1L;

        // 模拟获取统计数据
        Map<String, Object> map = new HashMap<>();
        map.put("totalSales", 10000); // 总销售额
        map.put("orderCount", 100); // 订单总数
        map.put("todaySales", 1000); // 今日销售额
        map.put("todayOrderCount", 10); // 今日订单数
        map.put("dishCount", 50); // 菜品总数
        map.put("userCount", 200); // 用户总数

        return Result.success(map);
    }

    /**
     * 分页查询用户列表
     */
    @Override
    public Result<Page<User>> getUserPage(int page, int pageSize, String username, String name, String phone) {
        log.info("商家查询用户列表，page={}, pageSize={}, username={}, name={}, phone={}",
                page, pageSize, username, name, phone);

        // 创建分页对象
        Page<User> pageInfo = new Page<>(page, pageSize);

        // 创建条件构造器
        LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();

        // 添加查询条件
        if (username != null && !username.trim().isEmpty()) {
            queryWrapper.like(User::getUsername, username.trim());
        }
        if (name != null && !name.trim().isEmpty()) {
            queryWrapper.like(User::getName, name.trim());
        }
        if (phone != null && !phone.trim().isEmpty()) {
            queryWrapper.like(User::getPhone, phone.trim());
        }

        // 排序条件：按创建时间降序
        queryWrapper.orderByDesc(User::getCreateTime);

        // 执行分页查询
        Page<User> result = userMapper.selectPage(pageInfo, queryWrapper);

        log.info("用户列表查询结果: 总数={}, 当前页记录数={}",
                result.getTotal(), result.getRecords() != null ? result.getRecords().size() : 0);

        return Result.success(result);
    }

    /**
     * 更新用户状态
     */
    @Override
    public Result<String> updateUserStatus(Long id, Integer status) {
        log.info("商家更新用户状态，用户ID：{}, 状态：{}", id, status);

        // 校验状态值
        if (status == null || (status != 0 && status != 1)) {
            return Result.error("状态值无效，只能是0（禁用）或1（启用）");
        }

        // 查询用户是否存在
        User user = userMapper.selectById(id);
        if (user == null) {
            return Result.error("用户不存在");
        }

        // 更新用户状态
        user.setStatus(status);
        int updateResult = userMapper.updateById(user);

        if (updateResult > 0) {
            String statusText = status == 1 ? "启用" : "禁用";
            log.info("用户状态更新成功，用户ID：{}, 状态：{}", id, statusText);
            return Result.success("用户状态更新成功");
        } else {
            log.error("用户状态更新失败，用户ID：{}", id);
            return Result.error("用户状态更新失败");
        }
    }

    /**
     * 获取用户详情
     */
    @Override
    public Result<User> getUserDetail(Long id) {
        log.info("商家查询用户详情，用户ID：{}", id);

        // 查询用户信息
        User user = userMapper.selectById(id);
        if (user == null) {
            return Result.error("用户不存在");
        }

        // 清除敏感信息
        user.setPassword(null);

        return Result.success(user);
    }
}